# This modified patch is to disable the hunk applying to LLVM, unbundled in Guix.

# Add mrustc slice length intrinsics
--- src/libcore/intrinsics.rs
+++ src/libcore/intrinsics.rs
@@ -685,4 +685,8 @@
     pub fn min_align_of_val<T: ?Sized>(_: &T) -> usize;
 
+    /// Obtain the length of a slice pointer
+    #[cfg(rust_compiler="mrustc")]
+    pub fn mrustc_slice_len<T>(pointer: *const [T]) -> usize;
+
     /// Gets a static string slice containing the name of a type.
     pub fn type_name<T: ?Sized>() -> &'static str;

--- src/libcore/slice/mod.rs
+++ src/libcore/slice/mod.rs
@@ -68,5 +68,8 @@
     pub const fn len(&self) -> usize {
-        unsafe {
-            crate::ptr::Repr { rust: self }.raw.len
-        }
+        #[cfg(not(rust_compiler="mrustc"))]
+        #[cfg_attr(not(bootstrap), allow_internal_unstable(const_fn_union))]
+        const fn len_inner<T>(s: &[T]) -> usize { unsafe { crate::ptr::Repr { rust: s }.raw.len } };
+        #[cfg(rust_compiler="mrustc")]
+        const fn len_inner<T>(s: &[T]) -> usize { unsafe { crate::intrinsics::mrustc_slice_len(s) } }
+        len_inner(self)
     }
#
# Static-link rustc_codegen_llvm so the generated rustc is standalone
# > Note: Interacts with `rustc-1.39.0-overrides.toml`
#
--- src/librustc_interface/util.rs
+++ src/librustc_interface/util.rs
@@ -421,2 +421,4 @@
 pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend> {
+    #[cfg(rust_compiler="mrustc")]
+    { if(backend_name == "llvm") { extern "Rust" { fn __rustc_codegen_backend() -> Box<dyn CodegenBackend>; } return || unsafe { __rustc_codegen_backend() } } }
     // For now we only allow this function to be called once as it'll dlopen a
# Disable most architecture intrinsics
--- src/stdarch/crates/std_detect/src/detect/mod.rs
+++ src/stdarch/crates/std_detect/src/detect/mod.rs
@@ -74,4 +74,7 @@
         // this run-time detection logic is never called.
         #[path = "os/other.rs"]
         mod os;
+    } else if #[cfg(rust_compiler="mrustc")] {
+        #[path = "os/other.rs"]
+        mod os;
     } else if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] {
--- vendor/ppv-lite86/src/lib.rs
+++ vendor/ppv-lite86/src/lib.rs
@@ -12,10 +12,10 @@
-#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri)))]
+#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri), not(rust_compiler="mrustc")))]
 pub mod x86_64;
-#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri)))]
+#[cfg(all(feature = "simd", target_arch = "x86_64", not(miri), not(rust_compiler="mrustc")))]
 use self::x86_64 as arch;

-#[cfg(any(miri, not(all(feature = "simd", any(target_arch = "x86_64")))))]
+#[cfg(any(miri, rust_compiler="mrustc", not(all(feature = "simd", any(target_arch = "x86_64")))))]
 pub mod generic;
-#[cfg(any(miri, not(all(feature = "simd", any(target_arch = "x86_64")))))]
+#[cfg(any(miri, rust_compiler="mrustc", not(all(feature = "simd", any(target_arch = "x86_64")))))]
 use self::generic as arch;

# diff --git a/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h b/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h
# index da9d9d5bfdc0..3d47471f0ef0 100644
# --- src/llvm-project/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h
# +++ src/llvm-project/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h
# @@ -16,6 +16,8 @@
#  #include "llvm/Demangle/DemangleConfig.h"
#  #include "llvm/Demangle/StringView.h"
#  #include <array>
# +#include <cstdint>
# +#include <string>

#  namespace llvm {
#  namespace itanium_demangle {
##
## gcc (used by mrustc) has 16-byte uint128_t alignment, while rustc uses 8
##
#--- src/libsyntax/ast.rs
#+++ src/libsyntax/ast.rs
#@@ -986,2 +986,2 @@
#-#[cfg(target_arch = "x86_64")]
#-static_assert_size!(Expr, 96);
#+//#[cfg(target_arch = "x86_64")]
#+//static_assert_size!(Expr, 96);
#--- src/librustc/ty/sty.rs
#+++ src/librustc/ty/sty.rs
#@@ -2258,2 +2258,2 @@
#-#[cfg(target_arch = "x86_64")]
#-static_assert_size!(Const<'_>, 40);
#+//#[cfg(target_arch = "x86_64")]
#+//static_assert_size!(Const<'_>, 40);

